package homework.four;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class TableInfo {
    private String tableName;// 表名
    private Class clazz;// 需要生成表的类
    private boolean needPersist;// 保存
    Map<String, ColumnInfo> columns = new HashMap<String, ColumnInfo>();// 模拟表，存储信息

    public TableInfo getTableInfo(Class<?> clazz1){
        this.clazz = clazz1;
        tableName = clazz.getSimpleName();// 得到类的简写名称
        Annotation[] annotations = clazz.getAnnotations();//得到注解
        for(Annotation annotation : annotations){
            if(annotation.annotationType().equals(Entity.class)){//实体
                needPersist = true;
                Entity entity = (Entity)annotation;
                if(!entity.value().equals("")){
                    tableName = entity.value();// 得到注解名
                }
                break;
            }
        }
        if(needPersist){
            Field[] fields = clazz.getDeclaredFields();// 得到属性
            for(Field field : fields){
                ColumnInfo columnInfo = new ColumnInfo();
                columnInfo = columnInfo.parse(field);// 转换成属性列
                if(columnInfo != null){
                    this.columns.put(field.getName(), columnInfo);// 存储属性信息
                }
            }
            return  this;
        }else {// 不保存
            return null;
        }
    }
    @Override
    public String toString(){// 生成创建表的sql语句（调用columnInfo生成列）
        StringBuilder sql = new StringBuilder();
        sql.append(Constant.NEXTLINE);
        sql.append("create table ");
        sql.append(this.tableName + " (" + "");
        for(ColumnInfo column : this.columns.values()){// 每行一个属性及其约束
            sql.append(Constant.NEXTLINE);
            sql.append(Constant.TAB);
            sql.append(column.toString());
        }
        sql.append("\n");
        sql.append(");");
        return  sql.toString();
    }
    public static void main(String[] args) {
        TableInfo test = new TableInfo();
        test.getTableInfo(Person.class);
        System.out.println(test.toString());
    }
}
